package main

import (
	"errors"
)

// T 类型参数 名字叫做T, 约束是any， 等于没有约束
type List[T any] interface {
	Add(idx int, t T)
	Append(t T)
}

func UseList() {
	var l List[int]
	l.Append(12)
	var l1 List[any]
	l1.Append("string")
	l1.Append(123)

}

func main() {
	//UseList()
	println(Sum[int](1, 2, 3, 4))
	var j MyMarchal
	ReleaseReource[*MyMarchal](&j)

}

type MyMarchal struct {
}

func (m *MyMarchal) MarshalJSON() ([]byte, error) {
	//TODO implement me
	panic("implement me")
}

type LinkedList[T any] struct {
	head *node[T]
}

// 泛型
type node[T any] struct {
	val T
}

func Max[T Number](vals ...T) (T, error) {
	res := vals[0]
	if len(vals) == 1 {
		var t T
		return t, errors.New("你的下标不对")
	}
	for i := 1; i < len(vals); i++ {
		if vals[i] > res {
			res = vals[i]
		}
	}
	return res, nil
}

func AddSlice[T any](slice []T, index int, val T) ([]T, error) {
	//如果我这边index 是负数，或者超过了slice的界限
	if index < 0 || index > len(slice) {
		return nil, errors.New("下标错误")
	}
	res := make([]T, 0, len(slice)+1)
	for i := 0; i < index; i++ {
		res = append(res, slice[i])
	}
	slice[index] = val
	for i := index + 1; i < len(slice); i++ {
		res = append(res, slice[i])
	}
	return res, nil

}
